/*
 * -------------------------------------------------------------
 *  FECHA      HORA     NOMBRE           COMENTARIO
 * -------------------------------------------------------------
 *  15/05/08   17:23    ALEX             Creación de interface.
 *  19/05/08   17:09    ALEX             Implementación de la clase
 *  22/05/08    9:36    ALEX             Inclusión de la valoración
 *                                       heurística en la implementación.
 * 
 */

package net.ieslaferreria.infoCiutat;

import java.util.Vector;
import net.ieslaferreria.lib.tipusdinamics.CuaPrioritariaVectorImpl;

/**
 *
 * @author Alex, Javi, David y Sergio
 */
public class CercaImpl implements Cerca {
    
    /*
     * Variable que guarda els parametres de cerca.
     */
    private ParametresCerca parametres;
    
    public Ruta cercaRuta(ParametresCerca parametres) {
        
        Ruta ruta = null;
        Ruta rutaAux = new RutaImpl(parametres.getPuntInici());
        Vector arestesDelPunt = new Vector();
	Validacio aresta = new ValidacioImpl();
        Punt puntActual = parametres.getPuntInici();
        CuaPrioritariaVectorImpl cuaArestes = new CuaPrioritariaVectorImpl();
        CuaPrioritariaVectorImpl cuaRutes = new CuaPrioritariaVectorImpl();
        ArestaManager arestes = new ArestaManagerImpl();
	int ind = 0;
        int codiAresta;
        

        while (!cuaArestes.esBuida() && ruta != null){
            ind = 0;
            arestesDelPunt = puntActual.getArestes();
            rutaAux = null;
            while (arestesDelPunt.size() > ind && !arestesDelPunt.isEmpty()){
                codiAresta = Integer.parseInt(String.valueOf(arestesDelPunt.
                                                                elementAt(ind)));
                aresta = (Validacio)arestes.getAresta(codiAresta);
                if(aresta.validarParametres(parametres).booleanValue() && 
                               aresta.validarSentit(puntActual).booleanValue()){
                    aresta.setTempsRuta(aresta.getTemps()+aresta.getTempsRuta());
                    aresta.calculaValorHeuristic(parametres, puntActual);
                    cuaArestes.encua(aresta);
                    if(!cuaRutes.esBuida()){
                        rutaAux = (Ruta)cuaRutes.escapca();
                    }
                    rutaAux.addAresta(aresta);
                    cuaRutes.encua(rutaAux);
                }
                ind++;
            }
        
            aresta = (Validacio)cuaArestes.escapca();
            if (aresta.getPuntInici() == puntActual){
                puntActual = aresta.getPuntFinal();
            } else {
                puntActual = aresta.getPuntInici();
            }
            if (puntActual == parametres.getPuntFinal() && 
                rutaAux.getTempsTotal() < ruta.getTempsTotal() &&
                rutaAux != null){
                ruta = rutaAux; 
            }
        }

        return ruta;
    }
    
    public ParametresCerca getParametres(){
        return this.parametres;
    }
    
    public void setParametres(ParametresCerca nouParametres){
        this.parametres = nouParametres;
    }
    
}
